import express, { Request, Response, Router } from 'express';
import { adminAuthMiddleware, requireAdmin } from '../../middleware/adminAuth';
import { ApiResponse } from '../../utils/response';
import { settlementService } from '../../services/settlementService';

const router: Router = express.Router();

// 所有结算管理路由都需要管理员权限（SUPER_ADMIN 或 ADMIN，排除 PARTNER）
router.use(adminAuthMiddleware, requireAdmin);

/**
 * 执行每日结算（手动触发）
 * POST /api/admin/settlement/daily
 */
router.post('/daily', adminAuthMiddleware, async (req: Request, res: Response): Promise<void> => {
  try {
    console.log('[관리자] 수동으로 일일 정산 실행');

    const result = await settlementService.dailySettlement();

    if (result.success) {
      res.json(ApiResponse.success({
        settledUsers: result.settledUsers,
        totalRewards: result.totalRewards,
        errors: result.errors
      }, `정산 완료: ${result.settledUsers}명의 사용자, 총 보상 ${result.totalRewards.toFixed(4)} NEAR`));
    } else {
      res.status(500).json(ApiResponse.error('일일 정산에 실패했습니다.', 500, {
        settledUsers: result.settledUsers,
        totalRewards: result.totalRewards,
        errors: result.errors
      }));
    }
  } catch (error) {
    console.error('[관리자] 일일 정산 오류:', error);
    res.status(500).json(ApiResponse.error('일일 정산에 실패했습니다.'));
  }
});

/**
 * 为指定用户执行结算
 * POST /api/admin/settlement/user/:userId
 */
router.post('/user/:userId', adminAuthMiddleware, async (req: Request, res: Response): Promise<void> => {
  try {
    const userId = parseInt(req.params.userId);

    if (!userId || isNaN(userId)) {
      res.status(400).json(ApiResponse.error('유효하지 않은 사용자 ID입니다.'));
      return;
    }

    console.log(`[관리자] 사용자 ${userId}에 대해 수동 정산을 실행합니다.`);

    const result = await settlementService.settleUser(userId);

    if (result.success) {
      res.json(ApiResponse.success({
        rewardNear: result.rewardNear,
        rewardKrw: result.rewardKrw
      }, `사용자 ${userId} 정산이 완료되었습니다: ${result.rewardNear.toFixed(4)} NEAR (${result.rewardKrw.toFixed(2)} KRW)`));
    } else {
      res.status(400).json(ApiResponse.error(result.message));
    }
  } catch (error) {
    console.error('[관리자] 사용자 정산 오류:', error);
    res.status(500).json(ApiResponse.error('사용자 정산에 실패했습니다.'));
  }
});

/**
 * 获取结算历史
 * GET /api/admin/settlement/history/:userId
 */
router.get('/history/:userId', adminAuthMiddleware, async (req: Request, res: Response): Promise<void> => {
  try {
    const userId = parseInt(req.params.userId);
    const limit = parseInt(req.query.limit as string) || 30;

    if (!userId || isNaN(userId)) {
      res.status(400).json(ApiResponse.error('유효하지 않은 사용자 ID입니다.'));
      return;
    }

    const history = await settlementService.getSettlementHistory(userId, limit);

    res.json(ApiResponse.success({
      userId,
      history,
      total: history.length
    }, '정산 내역 조회에 성공했습니다.'));
  } catch (error) {
    console.error('[관리자] 정산 내역 조회 오류:', error);
    res.status(500).json(ApiResponse.error('정산 내역 조회에 실패했습니다.'));
  }
});

export default router;
